package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.ProgramaVO;
import com.cs.beneficios.business.model.RepAtributoVO;
import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class RepBeneficioOtorgadoDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */
	public RepBeneficioOtorgadoDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public Collection getBeneficioOtorgado(RepBeneficioOtorgadoVO criterea)
			throws SQLException {
		String query = "SELECT COUNT(beneotor.codigo) cantidad_otorgada, sede.CODIGO codsede, "
				+ "sede.NOMBRE nomsede, prog.CODIGO codpro, prog.NOMBRE nompro, "
				+ "subpro.CODIGO codsubpro, subpro.NOMBRE nomsubpro "
				+ "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede "
				+ "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "
				+ "AND beneotor.SEDE_CODIGO = sede.CODIGO AND subpro.PRG_CODIGO = prog.CODIGO "
				+ "AND beneotor.FECHA_BENEFICIO <= sysdate and prog.vigencia='A' and subpro.vigencia='A' ";

		if ((Object) criterea.getCodeSede() != null) {
			query += " and sede.CODIGO = " + criterea.getCodeSede();
		}
		if ((Object) criterea.getCodeSubprograma() != null) {
			query += " and subpro.CODIGO = " + criterea.getCodeSubprograma();
		}
		if ((Object) criterea.getCodePrograma() != null) {
			query += " and prog.CODIGO = " + criterea.getCodePrograma();
		}

		if ((Object) criterea.getDesde() != null
				&& (Object) criterea.getHasta() != null) {
			query += " and beneotor.FECHA_BENEFICIO between to_date('"
					+ criterea.getDesde() + "','dd/mm/yyyy') and to_date('"
					+ criterea.getHasta() + "','dd/mm/yyyy')";
		}

		if ((Object) criterea.getGestor() != null
				&& criterea.getCodigoAtrGestor() != null) {
			query += " and Fcs_Ben_Valor_Atributo("
					+ criterea.getCodigoAtrGestor()
					+ ", beneotor.CODIGO, beneotor.BEN_CODIGO, beneotor.FECHA_BENEFICIO) = '"
					+ criterea.getGestor() + "' ";
		}
		// if((Object)criterea.getDesde() != null && (Object)criterea.getHasta()
		// == null)
		// {
		// query += "and beneotor.FECHA_BENEFICIO >= '"+criterea.getDesde()+"'";
		// }
		// if((Object)criterea.getDesde() == null && (Object)criterea.getHasta()
		// != null)
		// {
		// query += "and beneotor.FECHA_BENEFICIO <= '"+criterea.getHasta()+"'";
		// }
		query += " GROUP BY sede.CODIGO, sede.NOMBRE, prog.CODIGO, prog.NOMBRE, subpro.CODIGO, "
				+ "subpro.NOMBRE";

		query += " ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE ";
		// System.out.println("query " + query);
		ResultSet rst = null;
		ArrayList lbeneotor = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		RepBeneficioOtorgadoVO beneotorVO = null;
		while (rst.next()) {
			beneotorVO = new RepBeneficioOtorgadoVO();

			beneotorVO.setCodeSede(new Long(rst.getLong("codsede")));
			beneotorVO.setNombreSede(rst.getString("nomsede"));
			beneotorVO.setCodePrograma(new Long(rst.getLong("codpro")));
			beneotorVO.setNombrePrograma(rst.getString("nompro"));
			beneotorVO.setCodeSubprograma(new Long(rst.getLong("codsubpro")));
			beneotorVO.setNombreSubprograma(rst.getString("nomsubpro"));
			beneotorVO.setDesde(criterea.getDesde());
			beneotorVO.setHasta(criterea.getHasta());
			beneotorVO.setCantidad(rst.getString("cantidad_otorgada"));
			lbeneotor.add(beneotorVO);

			beneotorVO = null;
		}
		rst.close();
		return lbeneotor;
	}

	public Collection getBeneficioOtorgadoConGestor(
			RepBeneficioOtorgadoVO criterea) throws SQLException {
		String query = "SELECT COUNT(beneotor.codigo) cantidad_otorgada, sede.CODIGO codsede, "
				+ "sede.NOMBRE nomsede, prog.CODIGO codpro, prog.NOMBRE nompro, "
				+ "subpro.CODIGO codsubpro, subpro.NOMBRE nomsubpro "
				+ "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede, TCS_BEN_SUBP_ATR_BENEFICIARIO sab "
				+ "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "
				+ "AND beneotor.SEDE_CODIGO = sede.CODIGO AND subpro.PRG_CODIGO = prog.CODIGO "
				+ "AND beneotor.FECHA_BENEFICIO <= sysdate and prog.vigencia='A' and subpro.vigencia='A' "
				+ "AND sab.sbpr_codigo = subpro.codigo AND UPPER(TRIM(sab.NOMBRE)) = 'GESTOR' ";

		if ((Object) criterea.getCodeSede() != null) {
			query += " and sede.CODIGO = " + criterea.getCodeSede();
		}
		if ((Object) criterea.getCodeSubprograma() != null) {
			query += " and subpro.CODIGO = " + criterea.getCodeSubprograma();
		}
		if ((Object) criterea.getCodePrograma() != null) {
			query += " and prog.CODIGO = " + criterea.getCodePrograma();
		}

		if ((Object) criterea.getDesde() != null
				&& (Object) criterea.getHasta() != null) {
			query += " and beneotor.FECHA_BENEFICIO between to_date('"
					+ criterea.getDesde() + "','dd/mm/yyyy') and to_date('"
					+ criterea.getHasta() + "','dd/mm/yyyy')";
		}

		if ((Object) criterea.getGestor() != null
				&& criterea.getCodigoAtrGestor() != null) {
			query += " and Fcs_Ben_Valor_Atributo("
					+ criterea.getCodigoAtrGestor()
					+ ", beneotor.CODIGO, beneotor.BEN_CODIGO, beneotor.FECHA_BENEFICIO) = '"
					+ criterea.getGestor() + "' ";
		}

		query += " GROUP BY sede.CODIGO, sede.NOMBRE, prog.CODIGO, prog.NOMBRE, subpro.CODIGO, "
				+ "subpro.NOMBRE";

		query += " ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE ";
		// System.out.println("queryRepBeneficioOtorgadoDAO.getBeneficioOtorgadoConGestor: "
		// + query);
		ResultSet rst = null;
		ArrayList lbeneotor = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		RepBeneficioOtorgadoVO beneotorVO = null;
		while (rst.next()) {
			beneotorVO = new RepBeneficioOtorgadoVO();

			beneotorVO.setCodeSede(new Long(rst.getLong("codsede")));
			beneotorVO.setNombreSede(rst.getString("nomsede"));
			beneotorVO.setCodePrograma(new Long(rst.getLong("codpro")));
			beneotorVO.setNombrePrograma(rst.getString("nompro"));
			beneotorVO.setCodeSubprograma(new Long(rst.getLong("codsubpro")));
			beneotorVO.setNombreSubprograma(rst.getString("nomsubpro"));
			beneotorVO.setDesde(criterea.getDesde());
			beneotorVO.setHasta(criterea.getHasta());
			beneotorVO.setCantidad(rst.getString("cantidad_otorgada"));
			lbeneotor.add(beneotorVO);

			beneotorVO = null;
		}
		rst.close();
		return lbeneotor;
	}

	public Collection getListaAtri(String CodAtri) throws SQLException {
		int iCodAtri = Integer.parseInt(CodAtri.trim());
		String query = "SELECT vfl.DESCRIPCION descrip, vfl.CODIGO_VALOR codvalor "
				+ "FROM TCS_BEN_SUBP_ATR_BENEFICIARIO atri, "
				+ "paoyer.TCS_TIPO_VALOR_FLEX tvfl, paoyer.TCS_VALOR_FLEXIBLE vfl "
				+ "WHERE atri.CODIGO = "
				+ iCodAtri
				+ " "
				+ "AND atri.TTVF_CODIGO_DOMINIO=tvfl.CODIGO "
				+ "AND tvfl.CODIGO=vfl.TVF_CODIGO " + "AND vfl.VIGENCIA='S'";

		// System.out.println("query getListaAtri: " + query);
		ResultSet rst = null;
		ArrayList lista = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);

		while (rst.next()) {
			VflexVO vflVO = new VflexVO();
			vflVO.setDescVflex(rst.getString("descrip"));
			vflVO.setCodigoVflex(rst.getString("codvalor"));
			vflVO.setNombreVflex(rst.getString("codvalor") + "~"
					+ rst.getString("descrip"));

			lista.add(vflVO);
		}
		rst.close();
		return lista;
	}

	public List getAtributoEspecificos(String strSubprograma)
			throws SQLException {
		int sub = Integer.parseInt(strSubprograma.trim());
		String strSQL;
		List listaAtriEsp = new LinkedList();

		strSQL = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, nvl(REST_CODIGO,'0') REST_CODIGO, ORDEN, LONGITUD, "
				+ "OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
				+ "DESCRIPCION, TIPO_DATO, TTVF_CODIGO_DOMINIO "
				+ "FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO="
				+ sub
				+ " " + "AND VIGENCIA = 'A' ORDER BY ORDEN";

		ResultSet rst = null;
		rst = cf.getRecordsRset(strSQL, null, conn);

		while (rst.next()) {
			RepAtributoVO repatriVO = new RepAtributoVO();
			repatriVO.setCodigo(new Long(rst.getString("CODIGO")));
			repatriVO.setEtiqueta(rst.getString("ETIQUETA"));
			repatriVO.setOrigen("E");
			listaAtriEsp.add(repatriVO);
		}
		return listaAtriEsp;
	}

	// public Collection findProgramaByUser(Long codeUser, Long codeGus) throws
	// SQLException
	// {
	// String query =
	// "SELECT pro.codigo codePrograma, UPPER(pro.nombre) nomPrograma "+
	// "FROM TCS_BEN_PROGRAMA pro, paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gus "+
	// "WHERE pro.CODIGO IN "+
	// "                     (SELECT DISTINCT subpro.PRG_CODIGO "+
	// "                     FROM TCS_BEN_SUBPROGRAMA subpro, paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gus, "+
	// "                     TCS_BEN_PROGRAMA pro,TCS_BEN_SUBPROGRAMA_USUARIO subus  "+
	// "                     WHERE subpro.USU_CODIGO = usu.CODIGO "+
	// "                     AND pro.codigo = subpro.PRG_CODIGO AND gus.CODIGO = "+codeGus+" "+
	// "                     AND (33 = "+codeGus+" OR 128 = "+codeGus+" OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
	// "                     OR subus.SBPR_CODIGO = subpro.CODIGO AND subus.USU_CODIGO = usu.CODIGO "+
	// "                     AND subus.USU_CODIGO = "+codeUser+" ) "+
	// "AND pro.USU_CODIGO = usu.CODIGO AND gus.CODIGO = "+codeGus+
	// //" AND (33 = "+codeGus+" OR 128 = "+codeGus+" OR usu_codigo = "+codeUser+") "+
	// " AND Fcs_Ben_Val_Vigencia(pro.VIGENCIA, pro.DESDE_VIGENCIA, pro.HASTA_VIGENCIA, SYSDATE) = 'A' "+
	// "ORDER BY pro.nombre";
	// //System.out.println(query);
	// ResultSet rst = null;
	// ArrayList programas = new ArrayList();
	// rst = cf.getRecordsRset(query,null,conn);
	// ProgramaVO pro = null;
	// while ( rst.next() )
	// {
	// pro = new ProgramaVO();
	// pro.setCode(new Long(rst.getLong( "codePrograma")));
	// pro.setNombre(rst.getString( "nomPrograma"));
	// programas.add(pro);
	// pro=null;
	// }
	// rst.close();
	// return programas;
	// }

	/**
	 * Metodo que me lista los programas por usuario sin tener en cuenta la
	 * vigencia
	 * 
	 * @param codeUser
	 * @param codeGus
	 * @return
	 * @throws java.sql.SQLException
	 */
	public Collection findProgramaByUserReport(Long codeUser,
			String userGroupName, Long codeArea) throws SQLException {
		// ProgramaDAO proDAO = new ProgramaDAO(cf);
		// Collection programas = proDAO.findProgramaByCriterea(new
		// ProgramaVO(),codeUser,userGroupName, codeArea);
		// cf.closeConnection(proDAO.getConn());
		// return programas;

		ProgramaVO criterea = new ProgramaVO();
		String query = "SELECT DISTINCT pro.CODIGO COD_PROGRAMA, pro.NOMBRE NOM_PROGRAMA, pro.DESCRIPCION DESC_PROGRAMA, "
				+ "pro.OBJETIVO, pro.POBLACION_OBJETIVO, area.CODIGO COD_AREA, area.NOMBRE NOM_AREA, "
				+ "usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, a.admProg "
				+ "FROM VCS_BEN_SUBPROG_ALLOWED a, "
				+ "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu, "
				+ "paoyer.tcs_grupo_usuario gus, TCS_BEN_SUBPROGRAMA_USUARIO subus "
				+ "WHERE  gus.CODIGO = usu.GUS_CODIGO "
				+ "AND a.COD_PROGRAMA = pro.CODIGO "
				+ "AND pro.AREA_CODIGO = area.CODIGO "
				+ "AND pro.USU_CODIGO = usu.CODIGO "
				+ "AND pro.VIGENCIA = 'A' ";

		if ((Object) codeUser != null) {
			query += "AND ('ADMINISTRADOR GENERAL' = '" + userGroupName
					+ "' OR 'SUPER USUARIO' = '" + userGroupName
					+ "' or admSubpro = " + codeUser
					+ "          OR pro.USU_CODIGO = " + codeUser
					+ " OR a.permisos = " + codeUser + " ";
			if (userGroupName != null
					&& userGroupName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " or COD_AREA = " + codeArea;
			}
			query += " ) ";
		} else {
			return null;
		}

		if (criterea.getCode() != null) {
			query += "AND COD_PROGRAMA = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += "AND NOM_PROGRAMA LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodeArea() != null) {
			query += "AND COD_AREA = " + criterea.getCodeArea();
		}

		query += " ORDER BY NOM_PROGRAMA";
		// System.out.println(query);
		ResultSet rst = null;
		ArrayList programas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		ProgramaVO pro = null;
		while (rst.next()) {
			pro = new ProgramaVO();
			pro.setCode(new Long(rst.getLong("COD_PROGRAMA")));
			pro.setNombre(rst.getString("NOM_PROGRAMA"));
			pro.setDescripcion(rst.getString("DESC_PROGRAMA"));
			pro.setObjetivo(rst.getString("OBJETIVO"));
			pro.setPoblacionObjetivo(rst.getString("POBLACION_OBJETIVO"));
			pro.setCodeArea(new Long(rst.getString("COD_AREA")));
			pro.setNombreArea(rst.getString("NOM_AREA"));
			pro.setCodeUsuario(new Long(rst.getString("COD_USUARIO")));
			pro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			programas.add(pro);
			pro = null;
		}
		rst.close();
		return programas;
	}

	public Collection findProgramaWithGestorByUserReport(Long codeUser,
			String userGroupName, Long codeArea) throws SQLException {
		ProgramaVO criterea = new ProgramaVO();
		String query = "SELECT DISTINCT pro.CODIGO COD_PROGRAMA, pro.NOMBRE NOM_PROGRAMA, pro.DESCRIPCION DESC_PROGRAMA, "
				+ "pro.OBJETIVO, pro.POBLACION_OBJETIVO, area.CODIGO COD_AREA, area.NOMBRE NOM_AREA, "
				+ "usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, a.admProg "
				+ "FROM VCS_BEN_SUBPROG_ALLOWED a, "
				+ "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, paoyer.TCS_USUARIO usu, TCS_BEN_SUBPROGRAMA sub, "
				+ "TCS_BEN_SUBP_ATR_BENEFICIARIO sab, paoyer.tcs_grupo_usuario gus, TCS_BEN_SUBPROGRAMA_USUARIO subus "
				+ "WHERE  gus.CODIGO = usu.GUS_CODIGO "
				+ "AND a.COD_PROGRAMA = pro.CODIGO "
				+ "AND pro.AREA_CODIGO = area.CODIGO "
				+ "AND pro.USU_CODIGO = usu.CODIGO "
				+ "AND pro.VIGENCIA = 'A' "
				+ "AND sub.prg_codigo = pro.codigo "
				+ "AND sab.SBPR_CODIGO = sub.codigo "
				+ "AND UPPER(TRIM(sab.nombre)) = 'GESTOR' ";

		if ((Object) codeUser != null) {
			query += "AND ('ADMINISTRADOR GENERAL' = '" + userGroupName
					+ "' OR 'SUPER USUARIO' = '" + userGroupName
					+ "' or admSubpro = " + codeUser
					+ "          OR pro.USU_CODIGO = " + codeUser
					+ " OR a.permisos = " + codeUser + " ";
			if (userGroupName != null
					&& userGroupName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " or COD_AREA = " + codeArea;
			}
			query += " ) ";
		} else {
			return null;
		}

		if (criterea.getCode() != null) {
			query += "AND COD_PROGRAMA = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += "AND NOM_PROGRAMA LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodeArea() != null) {
			query += "AND COD_AREA = " + criterea.getCodeArea();
		}

		query += " ORDER BY NOM_PROGRAMA";

		ResultSet rst = null;
		// System.out.println("queryEnteGestor: " + query);
		ArrayList programas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		ProgramaVO pro = null;
		while (rst.next()) {
			pro = new ProgramaVO();
			pro.setCode(new Long(rst.getLong("COD_PROGRAMA")));
			pro.setNombre(rst.getString("NOM_PROGRAMA"));
			pro.setDescripcion(rst.getString("DESC_PROGRAMA"));
			pro.setObjetivo(rst.getString("OBJETIVO"));
			pro.setPoblacionObjetivo(rst.getString("POBLACION_OBJETIVO"));
			pro.setCodeArea(new Long(rst.getString("COD_AREA")));
			pro.setNombreArea(rst.getString("NOM_AREA"));
			pro.setCodeUsuario(new Long(rst.getString("COD_USUARIO")));
			pro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			programas.add(pro);
			pro = null;
		}
		rst.close();
		return programas;
	}

	public Collection findSubProgramaByUser(Long codeUser,
			String userGroupName, String codeprograma, Long codeArea)
			throws SQLException {

		SubProgramaDAO subProgDAO = new SubProgramaDAO(cf);
		SubProgramaVO subProgVO = new SubProgramaVO();
		subProgVO.setCodePrograma(new Long(codeprograma));
		Collection subprogramas = subProgDAO.findSubPrograma(subProgVO,
				codeUser, userGroupName, codeArea);
		cf.closeConnection(subProgDAO.getConn());
		return subprogramas;
		// int iCodePrograma = Integer.parseInt(codeprograma.trim());
		// String query =
		// " SELECT DISTINCT pro.CODIGO codprog,pro.NOMBRE nompro,subpro.codigo codeSubprograma, "+
		// " UPPER(subpro.nombre) nomSubprograma, usu.codigo,subpro.usu_codigo,pro.usu_codigo "+
		// " FROM TCS_BEN_SUBPROGRAMA subpro, TCS_BEN_PROGRAMA pro, TCS_BEN_SUBPROGRAMA_USUARIO subus, paoyer.tcs_usuario usu "+
		// " WHERE pro.codigo = subpro.PRG_CODIGO "+
		// " AND ( subpro.CODIGO = subus.SBPR_CODIGO OR 33 = "+codeGus+" OR 128 = "+codeGus+"  OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
		// " AND  (subus.USU_CODIGO = usu.CODIGO OR 33 = "+codeGus+"  OR 128 = "+codeGus+"  OR subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo = "+codeUser+") "+
		// //" AND Fcs_Ben_Val_Vigencia(pro.VIGENCIA, pro.DESDE_VIGENCIA, pro.HASTA_VIGENCIA, SYSDATE) = 'A' "+
		// //" AND Fcs_Ben_Val_Vigencia(subpro.VIGENCIA, subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, SYSDATE) = 'A' "+
		// " AND usu.CODIGO = "+codeUser+" "+
		// " AND pro.CODIGO = "+iCodePrograma+" ORDER BY nompro";
		//
		// //System.out.println(query);
		// ResultSet rst = null;
		// ArrayList subprogramas = new ArrayList();
		// rst = cf.getRecordsRset(query,null,conn);
		// SubProgramaVO subpro = null;
		// while ( rst.next() )
		// {
		// subpro = new SubProgramaVO();
		// subpro.setCode(new Long(rst.getLong( "codeSubprograma")));
		// subpro.setNombre(rst.getString( "nomSubprograma"));
		// subpro.setNombrePrograma(rst.getString("nompro"));
		// subprogramas.add(subpro);
		// subpro=null;
		//
		// }
		// rst.close();
		// return subprogramas;
	}

	public Collection findPermissionsReports(Long codeUser,
			String userGroupName, String codeprograma, Long codeArea)
			throws SQLException {
		String query = "SELECT DISTINCT pro.CODIGO codprog,pro.NOMBRE nompro,subpro.codigo codeSubprograma, "
				+ "UPPER(subpro.nombre) nomSubprograma, usu.codigo,subpro.usu_codigo,pro.usu_codigo "
				+ "FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_PROGRAMA pro, "
				+ "TCS_BEN_SUBPROGRAMA_USUARIO subus, "
				+ "paoyer.tcs_usuario usu "
				+ "WHERE pro.codigo = subpro.PRG_CODIGO "
				+ "AND (subpro.CODIGO = subus.SBPR_CODIGO OR 'ADMINISTRADOR GENERAL' = '"
				+ userGroupName
				+ "' "
				+ "     OR 'SUPER USUARIO' = '"
				+ userGroupName
				+ "' OR subpro.usu_codigo = "
				+ codeUser
				+ " OR pro.usu_codigo = "
				+ codeUser
				+ ") "
				+ "AND subus.USU_CODIGO = usu.CODIGO "
				+ "AND usu.CODIGO = "
				+ codeUser + " " + "ORDER BY nompro";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("codeSubprograma")));
			subpro.setNombre(rst.getString("nomSubprograma"));
			subpro.setNombrePrograma(rst.getString("nompro"));
			subprogramas.add(subpro);
			subpro = null;

		}
		rst.close();
		return subprogramas;
	}

	/**
	 * Metodo para calcular los beneficios de un programa sin tener en cuenta la
	 * vigencia
	 * 
	 * @param codeUser
	 * @param codeGus
	 * @param codeprograma
	 * @return
	 * @throws java.sql.SQLException
	 */
	public Collection findSubProgramaByUserReport(Long codeUser,
			String userGroupName, String codeprograma, Long codeArea)
			throws SQLException {
		SubProgramaDAO subProgDAO = new SubProgramaDAO(cf);
		SubProgramaVO subProgVO = new SubProgramaVO();
		subProgVO.setCodePrograma(new Long(codeprograma));
		Collection subprogramas = subProgDAO.findAllowedSubPrograma(subProgVO,
				codeUser, userGroupName, codeArea);
		cf.closeConnection(subProgDAO.getConn());
		return subprogramas;
	}

	public Collection findSubProgramaWithGestorByUserReport(Long codeUser,
			String userGroupName, String codeprograma, Long codeArea)
			throws SQLException {
		SubProgramaDAO subProgDAO = new SubProgramaDAO(cf);
		SubProgramaVO subProgVO = new SubProgramaVO();
		subProgVO.setCodePrograma(new Long(codeprograma));
		Collection subprogramas = subProgDAO.findAllowedSubProgramaWithGestor(
				subProgVO, codeUser, userGroupName, codeArea);
		cf.closeConnection(subProgDAO.getConn());
		return subprogramas;
	}

	public Connection getConn() {
		return conn;
	}
}